package com.cctc.juc.source.Bitc.Icontainer;
/**
 * 【JUC 高并发容器】
 * 1. JUC 高并发容器线程安全解决方案：
 * 1）在需要（共享）访问 Java 容器的方法上加上 synchronized 关键字（Java 内置锁）；
 * 2）使用 Volatile 关键字修饰 Java 容器保证内存可见性 + 使用 CAS “自旋” 机制保证（共享）容器 [更新操作] 的原子（独占、互斥）性。
 * 在 “读多写少” 的高并发场景，方案 2）[乐观（无）锁] 的性能要远远优于方案 1）。
 * 2. JUC 高并发容器体系结构：
 * - List：ArrayList、LinkedList -> Collections.synchronizedList -> [热频] CopyOnWriteArrayList；
 * - Set：HashSet、RBTreeSet -> Collections.synchronized[Sorted]Set -> CopyWriteArraySet、ConcurrentSkipListSet；
 * - Map：[热频] HashMap、RBTreeMap -> [热频] HashTable、Collections.synchronized[Sorted]Map -> [热频]
 * ConcurrentHashMap、ConcurrentSkipListMap；
 * - Queue：ArrayQueue、ArrayDeque、LinkedDeque、PriorityQueue -> Stack、Vector ->
 * ConcurrentLinkedQueue、ConcurrentLinkedDeque、[ArrayBlocking|LinkedBlocking|PriorityBlocking|Delay|Synchronous]Queue。
 * 3. [热频] CopyOnWriteArrayList 底层（COW 思想）实现原理。
 * [COW 写时复制思想] 在修改器对一块内存进行修改时，不直接在原内存上进行操作，而是将内存复制一份，在新内存中进行写操作，写完之后，再将原来的指针（或引用）指向新的内存，原来的内存被回收。
 * - CopyOnWriteArrayList 是 [COW 写时复制思想] 的一种典型实现案例；
 * - 类似的实现案例还有 MySQL 中基于 Undo Log 日志和虚拟表视图实现数据库事务 RC、RR 隔离级别的 MVCC 多版本并发控制机制。
 * CopyOnWriteArrayList 类内部实现原理：读的时候，不需要任何同步控制，因为原数组不会发生修改，只会被另外一个原数组副本替换，因此读操作是线程安全的；写的时候，需要加上独占锁，确保同一时刻只有一个线程进行写操作，避免多线程写的时候复制出多个副本，引发线程安全问题。
 * CopyOnWriteArrayList 与 ReentrantReadWriteLock 的比较：ReentrantReadWriteLock 为读读共享、写写互斥、读写互斥、写读互斥；而 CopyOnWriteArrayList 基于 COW 写时复制思想，为读读共享、写写互斥、读写隔离、写读隔离，即只有写写之间才需要加锁同步等待，将读取操作性能发挥到了极致。
 * 4. [热频] HashMap -> HashTable -> ConcurrentHashMap 底层（“热点分散” 之 Segment 分段锁思想）实现原理。
 * 热频面试点：
 * 1）哈希（散列）表底层实现原理，[手撕 & 陈述] HashMap 核心（主干）实现逻辑，包括 ThreadLocalMap；
 * 2）HashTable 与 ConcurrentHashMap 底层线程同步实现原理，[手撕 & 陈述] “热点分散” 之 “Segment 分段锁” 核心（主干）实现逻辑，包括 LongAdder、Redission（分布式）分段锁等。
 * 5. [热频] BlockingQueue 底层（“排队等待” 之 AQS 组件）实现原理。
 * 简介：BlockingQueue 阻塞队列的特点就在于 [阻塞] 二字，与普通队列相比，它提供了（基于 ReentrantLock 锁的 notEmpty & notFull 条件队列）阻塞式添加和删除元素的方法，使用它可以很容易的实现线程间的数据共享和通信。
 * BlockingQueue 接口常用方法及其特征（抛异常、返回特殊值、阻塞、限时阻塞）：
 * 1）[队尾] 添加元素
 * - add(E e)，成功返回 true，失败（队列已满）则抛出 IllegalStateException 异常；
 * - offer(E e)，成功返回 true，失败（队列已满）返回 false；
 * -（核心）put(E e)，成功返回 true，失败（队列已满）则一直阻塞。
 * 2）[队首] 删除元素
 * - poll()，失败（队列已空）返回 null；
 * - remove(Object o)，失败（队列已空）返回 false；
 * -（核心）take()，失败（队列已空）则一直阻塞。
 * 3）[队首] 获取元素
 * - element()，失败（队列已空）则抛出异常；
 * - peek()，失败（队列已空）则返回 null。
 * BlockingQueue 实现类及其特点：
 * - ArrayBlockingQueue：基于定长数组实现，有界，堆内存安全；无额外 Node 节点实例，内存开销低、GC 压力小；
 * - LinkedBlockingQueue：基于链表实现，默认无界，可能造成堆内存溢出；且会产生额外的 Node 节点实例开销，内存开销高、GC 压力大；
 * - PriorityBlockingQueue：非阻塞式生产，阻塞式消费，缺点同上，生产者速度不能大于消费者，否则也会操作堆内存溢出。
 * - DelayQueue：基于 PriorityQueue 优先队列实现的按照元素的延迟时间排序的 PriorityBlockingQueue，缺点同上。
 * - SynchronousQueue：无缓冲区同步队列，生产者直接对接消费者，适应于对单个消息的响应要求高的场景。
 * BlockingQueue 主要用于生产者-消费者问题。
 */